package com.atom.app.mvi.ui.compose

import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.TextField
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.MutableLiveData
import com.atom.app.mvi.utils.toast
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.*

/**
 * https://www.cnblogs.com/guanxinjing/p/16787401.html
 *
 */
class EffectComposeActivity : ComponentActivity() {
    /**
     *  remember：保存数据，并且在UI更新时会提供保存的值。但是Activity页面退出后会丢失保存的值
    rememberSaveable：保存数据，并且将值写入到bundle中，然后重新构建Activity的时候，从bundle读数据。这表示Activity退出后也不会丢失值。
    mutableStateOf ：一个可变并且被Compose时刻观察的状态存储，作用就是让Compose可以获知数据已经改变，UI上的内容需要重新绘制。
    mutableStateListOf：mutableStateOf只能观察单个类型数据的变化，无法观察到集合数据的变化。所以有了mutableStateListOf，方法参数带vararg关键字，所以它也可以是多个List组成的数组
    mutableStateMapOf：同上，只不过是以哈希的形式，方法参数带vararg关键字，所以它也可以是数组
    derivedStateOf：定义的对象状态依赖其他的对象状态时，需要使用derivedStateOf，当依赖对象状态发生改变，自己也可以跟着改变。
    rememberCoroutineScope ： 在Compose中创建一个协程作用域，用来调用外界的异步方法
    remember是用于临时保存数据的，而MutableState是用于通知与传递数据变化的。
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent { PreviewMessageCard() }
    }

    @Preview(name = "add")
    @Composable
    fun PreviewMessageCard() {
        MyTextField1()
    }

    private val dataLiveData = MutableLiveData<String>()
    suspend fun postData() {
        delay(1000)
        dataLiveData.postValue("登录成功${Date()}")
    }
    @Composable
    fun RememberCoroutineScope_Demo(){
        val scope = rememberCoroutineScope()
        Button(modifier = Modifier.fillMaxWidth(), onClick = {
            this@EffectComposeActivity.toast("点击了登录按钮")
            scope.launch {
                postData()
            }
        }) {
            androidx.compose.material.Text(text = "验证登录", color = Color.White)
        }
    }
    /**
     * LaunchedEffect的作用主要是让你在Compose作用域里实现协程工作，
     * 以完成异步、耗时数据处理、网络请求等等工作。
     */
    @Composable
    fun LaunchedEffect_Demo() {
        var count by remember { mutableStateOf(0) }

        LaunchedEffect(true) {
            while (true) {
                delay(1000)
                count++
            }
        }

        Button(onClick = { count++ }) {
            Text(text = "count ${count}")
        }
    }

    @Composable
    fun MyTextField() {
        val text = remember {
            mutableStateOf("")
        }
        MyLaunchedEffect(content = text.value)
        Column {
            TextField(value = text.value, onValueChange = {
                text.value = it
            })
        }
    }

    @Composable
    fun MyLaunchedEffect(content:String){
        Log.e("zh", "MyLaunchedEffect重组中 content = ${content}")
        LaunchedEffect(Unit){
            while (true){
                delay(500)
                Log.e("zh", "content = ${content}")
            }
        }
    }

    //-------------------------
    @Composable
    fun MyTextField1() {
        val text = remember {
            mutableStateOf("")
        }
        MyLaunchedEffect1(content = text.value)
        Column {
            TextField(value = text.value, onValueChange = {
                text.value = it
            })
        }
    }

    @Composable
    fun MyLaunchedEffect1(content:String){
        val contentUpdatedState by rememberUpdatedState(content) //添加rememberUpdatedState
        Log.e("zh", "MyLaunchedEffect重组中 content = ${contentUpdatedState}")
        LaunchedEffect(Unit){
            while (true){
                delay(500)
                Log.e("zh", "content = ${contentUpdatedState}")
            }
        }
    }
}

